package com.itheima.controller;

import cn.itheima.health.service.ReportService;
import com.itheima.constant.MessageConstant;
import com.itheima.healt.entlty.Result;
import org.apache.dubbo.config.annotation.Reference;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;


@RestController    // @   固定写法：    RestController     控制 是相应Js 格式  区别于 普通的 @Controller
@RequestMapping("/report")     //  RequestMapping  ： 请求映射
public class ReportController {

   @Reference
    private ReportService reportService;

    @RequestMapping("/getMemberReport.do")
    // 因为  Result 是一个相应实体类对象  所以这里返回值是Result
        //封装一个方法 用于返回数据
    public Result getMemberReoirt(){
       return reportService.getMemberReportLast12Month();
    }

    @RequestMapping("/getSetmealReport.do")
    public Result getSetmealReport(){
        return reportService.getSetmealReport();
    }

    @RequestMapping("/exportExcel.do")
// 先明确 这方法是下载 所以返回值 是void
         /*    一个流  ： response.getOutputStream
                2个头  :   文件类型头 :response.setContentType("XX")
                           附件头: response.setHeader("Content-Disposition","attachment;filename=")+ file.getName   */
         /*  写这方法之前 因为涉及到 Http 的 请求头  和响应流
                所以这里给方法传入2个Http的参数 ：请求 response 和 相应     session 参数
                                 通过这两个 参数的IPA 获得  请求 和响应的 方法                         */
    public void exportExcel(HttpServletResponse response, HttpSession session){

        try {
            // 获取Servlet上下文 就能找到 服务器中 文件的位置
            ServletContext servletContext = session.getServletContext();
            //  获取服务器中 绝对路径的 文件   表示Excel 文件 直接从服务器 中获取     realPath  就是文件的绝对路径
            String realPath = servletContext.getRealPath("/template/report_template.xlsx");
            // 表示获取文件的 真实路径    以供 输入流获取
            File file = new File(realPath);
            // 然后 读取 文件的真实路径  通过 InputStream 读取输入流 读取该文件
            // FileInputStream流被称为文件字节 输入流，意思指对文件数据以字节的形式进行 读取操作
            FileInputStream fileInputStream = new FileInputStream(file);
            // 拿到 将从服务器指定的文件路径 后通过文件输入流 将文件 放到 工作簿对象  中，表示 我们要对该文件 进行操作
            XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);  //  ------>     ***.xlsx
          /*  HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream)     ------>     ***.xlx    ;*/
//------------  以下是 获取文件之后 对文件的内容进行 操作和修改  -----------------------------------
            //输入 Excel 内容  getSheetAt: 获取工作表 ；getRow： 获取行 ； getCell：获取元素 ； setCellValue： 给元素设值
            workbook.getSheetAt(0).getRow(2).getCell(5).setCellValue("11");
            workbook.getSheetAt(0).getRow(2).getCell(5).setCellValue("11");
            workbook.getSheetAt(0).getRow(2).getCell(5).setCellValue("11");
//------------           以下是 文件 下载的代码       ：  1个流   2个头 -------------------------------------------------
            // 获取文件的mineType 类型：        file.getName()  ： 通过文件真实路径 .getName() 获取文件的名称
            String mimeType = servletContext.getMimeType(file.getName());
            // 获得第一个流：  一个流    一个流  ： response.getOutputStream
            ServletOutputStream outputStream = response.getOutputStream();
            //  获取        一个头     附件头：
            response.setHeader("Content-Disposition","attachment;filename="+file.getName());
            //  获取        二个头     文件类型头:  这样就拿到 其中的一个文件类型头
            response.setContentType(mimeType);
            // 将流对象 放到 工作簿中去 ： 相当于 将文件内容写到  工作簿当中去  就可以执行下载功能
            workbook.write(outputStream);
            //关流
            workbook.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
